# -*- coding: UTF-8 -*-
"""
    Module that provides some strings convertion functions:
    from unicode encoded str to unicode-string
    from str to unicode string
    from str to unicode encoded string
    Current user locale is being used for convertions.
"""
import locale
from . import exceptions
from . import log

lang_code = None
encoding = None

def initialize():
    """
    Initialize module. Detect and remember current locale.
    """
    global lang_code, encoding
    
    locale.resetlocale()
    if not lang_code is None or not encoding is None:
        raise exceptions.LocaleError("Module locale already initialized!")

    lang_code, encoding = locale.getlocale(locale.LC_CTYPE)
    
    log.debug("lang_code: `%s', encoding: `%s'" % (lang_code, encoding))

# it's assumed that locale-str is in `encoding', i.e. if encoding=='UTF8' then 
# locale-str is already unicode-encoded sting
def str2ustr(s):
    """
        Convert locale-str to unicode encoded string
    """
    return s.decode(encoding).encode("UTF8")

def ustr2str(s):
    """
        Convert unicode encoded string to locale-str
    """
    return s.decode("UTF8").encode(encoding)

def unicode2str(s):
    """
        Convert unicode string to locale-str
    """
    return s.encode(encoding)

def unicode2ustr(s):
    """
        Convert unicode string to unicode-encoded str
    """
    return s.encode("UTF8")

def str2unicode(s):
    """
        Convert locale-str to unicode string
    """
    return s.decode(encoding)

def ustr2unicode(s):
    """ 
        convert unicode encoded str to unicode string
    """
    if isinstance(s, unicode):
        return s

    return unicode(s, "UTF-8")

norm_tab = {
    u'/': u'-',
    u':': u'-', # colon is forbidden symbol in window$
    u'\u2013': u'-', # EN DASH
    u'\u2014': u'--', # EM DASH
    u'«': u'"', # russian quotes
    u'»': u'"',
    u'\u2116': u'No', # NUMERO SIGN,
    u'…': u'...', # HORIZONTAL ELLIPSIS
    u'\u201c': u'"', # LEFT DOUBLE QUOTATION MARK
    u'\u201d': u'"', # RIGHT DOUBLE QUOTATION MARK
    u'\xad': u' ', # SOFT HYPHEN
    u'\u0456': u'i', # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
    u'\u0404': u'e', # CYRILLIC CAPITAL LETTER UKRAINIAN IE
    u'\u0406': u'I', # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
    u'\u0454': u'e', # CYRILLIC SMALL LETTER UKRAINIAN IE
    u'\u0463': u'ъ', # CYRILLIC SMALL LETTER YAT
    u'\u0457': u'i', # CYRILLIC SMALL LETTER YI
    u'\u0407': u'I', # CYRILLIC CAPITAL LETTER YI
     u'\u2122': u'(tm)', # TRADE MARK SIGN
    u'\u045E': u'у', # CYRILLIC SMALL LETTER SHORT U
    u'\u201E': u'"', # DOUBLE LOW-9 QUOTATION MARK
    u'\u91D1': u'', # CJK UNIFIED IDEOGRAPH-91D1
    u'\u74F6': u'', # CJK UNIFIED IDEOGRAPH-74F6
    u'\u6885': u'', # CJK UNIFIED IDEOGRAPH-6885
    u'\u2019': u"'", # RIGHT SINGLE QUOTATION MARK
    u'\u2018': u"'", # LEFT SINGLE QUOTATION MARK
    u'\u0300': u"'", # COMBINING GRAVE ACCENT
    u'¿': u"", # INVERTED QUESTION MARK
    u'À': u'A', #
    u'Á': u'A', #                                                        
    u'Â': u'A', #                                                        
    u'Ã': u'A', #                                                        
    u'Ä': u'A', #                                                        
    u'Å': u'A', #                                                        
    u'Æ': u'AE', #                                                        
    u'Ç': u'C', #                                                        
    u'È': u'E', #                                                        
    u'É': u'E', #                                                        
    u'Ê': u'E', #                                                        
    u'Ë': u'E', #                                                        
    u'Ì': u'I', #                                                        
    u'Í': u'I', #                                                        
    u'Î': u'I', #                                                        
    u'Ï': u'I', #                                                        
    u'Ð': u'D', #                                                        
    u'Ñ': u'N', #                                                        
    u'Ò': u'O', #                                                        
    u'Ó': u'O', #                                                        
    u'Ô': u'O', #                                                        
    u'Õ': u'O', #                                                        
    u'Ö': u'O', #                                                        
    u'Ø': u'O', #                                                        
    u'Ù': u'U', #                                                        
    u'Ú': u'U', #                                                        
    u'Û': u'U', #
    u'Ü': u'U', #
    u'Ý': u'Y', #
    u'ý': u'y', #
    u'Þ': u'Th', #
    u'þ': u'th', #
    u'ß': u'SS', #
    u'à': u'a', #
    u'á': u'a', #
    u'â': u'a', #
    u'ã': u'a', #
    u'ä': u'a', #
    u'å': u'a', #
    u'æ': u'ae', #
    u'ç': u'c', #
    u'è': u'e', #
    u'é': u'e', #
    u'ê': u'e', #
    u'ë': u'e', #
    u'ì': u'i', #
    u'í': u'i', #
    u'î': u'i', #
    u'ï': u'i', #
    u'ð': u'th', #
    u'ñ': u'n', #
    u'ò': u'o', #
    u'ó': u'o', #
    u'ô': u'o', #
    u'õ': u'o', #
    u'ö': u'o', #
    u'ø': u'o', #
    u'ù': u'u', #
    u'ú': u'u', #
    u'û': u'u', #
    u'ü': u'u', # 
    u'Ā': u'A', #                                                          
    u'ā': u'a', #                                                          
    u'Ă': u'A', #                                                          
    u'ă': u'a', #
    u'Ą': u'A', #
    u'ą': u'a', #
    u'Ć': u'C', #
    u'ć': u'c', #
    u'Ĉ': u'C', #
    u'ĉ': u'c', #
    u'Ċ': u'C', #
    u'ċ': u'c', #
    u'Č': u'C', #
    u'č': u'c', #
    u'Ď': u'D', #
    u'ď': u'd', #
    u'Đ': u'D', #
    u'đ': u'd', #
    u'Ē': u'E', #
    u'ē': u'e', #
    u'Ĕ': u'E', #
    u'ĕ': u'e', #
    u'Ė': u'E', #
    u'ė': u'e', #
    u'Ę': u'E', #
    u'ę': u'e', #
    u'Ě': u'E', #
    u'ě': u'e', #
    u'Ĝ': u'G', #
    u'ĝ': u'g', #
    u'Ğ': u'G', #
    u'ğ': u'g', #
    u'Ġ': u'G', #
    u'ġ': u'g', #
    u'Ģ': u'G', #
    u'ģ': u'g', #
    u'Ĥ': u'H', #
    u'ĥ': u'h', #                                                          
    u'Ħ': u'H', #                                                          
    u'ħ': u'h', #                                                          
    u'Ĩ': u'I', #                                                          
    u'ĩ': u'i', #                                                          
    u'Ī': u'I', #                                                          
    u'ī': u'i', #                                                          
    u'Ĭ': u'I', #                                                          
    u'ĭ': u'i', #                                                          
    u'Į': u'I', #                                                          
    u'į': u'i', #                                                          
    u'İ': u'I', #                                                          
    u'ı': u'i', #                                                          
    u'Ĳ': u'IJ', #                                                          
    u'ĳ': u'ij', #                                                          
    u'Ĵ': u'J', #                                                          
    u'ĵ': u'j', #                                                          
    u'Ķ': u'K', #                                                          
    u'ķ': u'k', #                                                          
    u'ĸ': u'k', #                                                          
    u'Ĺ': u'L', #                                                          
    u'ĺ': u'l', #                                                          
    u'Ļ': u'L', #                                                          
    u'ļ': u'l', #                                                          
    u'Ľ': u'L', #                                                          
    u'ľ': u'l', #                                                          
    u'Ŀ': u'L', #                                                          
    u'ŀ': u'l', #                                                          
    u'Ł': u'L', #                                                          
    u'ł': u'l', #                                                          
    u'Ń': u'N', #                                                          
    u'ń': u'n', #                                                          
    u'Ņ': u'N', #                                                          
    u'ņ': u'n', #                                                          
    u'Ň': u'N', #                                                          
    u'ň': u'n', #                                                          
    u'ŉ': u'n', #                                                          
    u'Ŋ': u'N', #                                                          
    u'ŋ': u'n', #                                                          
    u'Ō': u'O', #                                                          
    u'ō': u'o', #                                                          
    u'Ŏ': u'O', #                                                          
    u'ŏ': u'o', #                                                          
    u'Ő': u'O', #                                                          
    u'ő': u'o', #                                                          
    u'Œ': u'OE', #                                                          
    u'œ': u'oe', #                                                          
    u'Ŕ': u'R', #                                                          
    u'ŕ': u'r', #                                                          
    u'Ŗ': u'R', #                                                          
    u'ŗ': u'r', #                                                          
    u'Ř': u'R', #                                                          
    u'ř': u'r', #                                                          
    u'Ś': u'S', #                                                          
    u'ś': u's', #                                                          
    u'Ŝ': u'S', #
    u'ŝ': u's', #
    u'Ş': u'S', #
    u'ş': u's', #
    u'Š': u'S', #
    u'š': u's', #
    u'Ţ': u'T', #
    u'ţ': u't', #
    u'Ť': u'T', #
    u'ť': u't', #
    u'Ŧ': u'T', #
    u'ŧ': u't', #
    u'Ũ': u'U', #
    u'ũ': u'u', #
    u'Ū': u'U', #
    u'ū': u'u', #
    u'Ŭ': u'U', #
    u'ŭ': u'u', #
    u'Ů': u'U', #
    u'ů': u'u', #
    u'Ű': u'U', #
    u'ű': u'u', #
    u'Ų': u'U', #
    u'ų': u'u', #
    u'Ŵ': u'W', #
    u'ŵ': u'w', #
    u'Ŷ': u'Y', #
    u'ŷ': u'y', #
    u'Ÿ': u'Y', #
    u'Ź': u'Z', #
    u'ź': u'z', #
    u'Ż': u'Z', #
    u'ż': u'z', #
    u'Ž': u'Z', #
}
norm_dic = {}
for k,v in norm_tab.iteritems():
    norm_dic[ord(k)] = v

def normalize(s):
    if isinstance(s, str):
        s = unicode(s)
    return s.translate(norm_dic)

trans_tab = {
    u'а': u'a',
    u'б': u'b',
    u'в': u'v',
    u'г': u'g',
    u'д': u'd',
    u'е': u'e',
    u'ё': u'jo',
    u'ж': u'zh',
    u'з': u'z',
    u'и': u'i',
    u'й': u'i',
    u'к': u'k',
    u'л': u'l',
    u'м': u'm',
    u'н': u'n',
    u'о': u'o',
    u'п': u'p',
    u'р': u'r',
    u'с': u's',
    u'т': u't',
    u'у': u'u',
    u'ф': u'f',
    u'х': u'kh',
    u'ц': u'ts',
    u'ч': u'ch',
    u'ш': u'sh',
    u'щ': u'sch',
    u'ъ': u'_',
    u'ы': u'i',
    u'ь': u'_',
    u'э': u'e',
    u'ю': u'ju',
    u'я': u'ja',
    u':': u'_',
    u'"': u'_', 
    u"'": u'_', 
    u' ': u'_', 
#    u'': u'', 
    }
trans_dic = {}
for k,v in trans_tab.iteritems():
    trans_dic[ord(k)] = v
    trans_dic[ord(k.upper())] = v.upper()

def translit(s):
    return s.translate(trans_dic)
